home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
DATABASE
/
ULTIMATE
/
a252cmp.txt
< prev
next >
Wrap
Internet Message Format
|
1993-08-09
|
2KB
From: dseal@armltd.co.uk (David Seal)
Subject: Doing comparisons correctly (was square roots)
Date: 26 Nov 91 19:49:10 GMT
In article <1991Nov22.104626.8428@odin.diku.dk> torbenm@diku.dk (Torben
AEgidius Mogensen) writes:
>Also, my ARM code used unsigned numbers but compared them as if they
>were signed (using PL). Comparison of unsigned numbers requires HS.
Oops. Yes, comparison of unsigned numbers should use HS/HI/LS/LO (note HS
and LO are other names for CS and CC, by the way). But comparison of signed
numbers should use GE/GT/LE/LT, not PL or MI!!!
You should in general not use PL and MI after comparisons. They *can* be
used after CMP Rn,#0, though GE and LT will do just as well. Comparing
against any other value, PL and MI can produce misleading results. E.g.
consider CMP Rn,#1. If Rn happens to contain the negative value &80000000,
CMP Rn,#1 will set the condition flags according to the value &80000000-1 =
&7FFFFFFF (giving a positive result - note there has been a signed overflow
in this calculation). This means that it will clear the N flag, and code
using PL/MI will decide that &80000000 >= 1 as a signed quantity! More
generally, code using PL/MI will get the answer wrong whenever the implicit
subtraction in the comparison suffers a signed overflow.
The GE/GT/LE/LT conditions take into account the possibility of signed
overflow and so don't get the answer wrong when it happens.
When should you use PL/MI? Generally:
(a) When you want to test the top bit of a value;
(b) When you want to check the sign of a value without disturbing the C
flag, TEQ Rn,#0 followed by use of PL/MI does the trick;
(c) The one exception I know to the above rule about not using PL/MI after
a comparison: if you're comparing two values of a steadily
incrementing clock, and you're reasonably confident that they aren't
more than 2^31-1 ticks apart, you should use PL/MI after a compare
instruction. This sort of "cyclic comparison" is rather peculiar - for
instance, you will find that &40000000 > 0, &80000000 > &40000000,
&C0000000 > &80000000 and 0 > &C0000000. The normal rule that if a > b
and b > c, then a > c does not apply to this type of comparison!
This cyclic comparison should be used in programs manipulating
interval timer values, in order to make certain they don't go wrong
when the timer wraps round from positive to negative values.
David Seal
dseal@armltd.co.uk